{"componentChunkName":"component---src-templates-blog-post-js","path":"/Today I Learned/Cant bind input when using_abstract_classes_2+_level_of_hierarchy/","result":{"data":{"site":{"siteMetadata":{"title":"JULog","author":"[Ju Chan Hwang]","siteUrl":"https://julog.netlify.app","comment":{"disqusShortName":"","utterances":"JuChanHwang/gatsby-starter-bee"},"sponsor":{"buyMeACoffeeId":"jbee"}}},"markdownRemark":{"id":"233439d9-dc95-57a6-a5e2-233b0eebe873","excerpt":"로컬 컴파일 시점에서는 아무 문제 없는 코드가 배포한 프로덕션에서 에러가 난다.😭 당황스럽지 않을 수가 없다… ㅎㅎ 빌드를 하게 되면 쓰지 않는 코드들을 자동으로 삭제하는데, AbstractComponent 안에 있는 input값이 사용되지 않는다고 판단해서 없앤 것 같다. 문제의 코드 추상 컴포넌트: AbstractComponent AbstractComponent를 extends하고 있는 컴포넌트 에러 메시지 can’t bind to keyEvents$ since it isn’t a known…","html":"<p>로컬 컴파일 시점에서는 아무 문제 없는 코드가 배포한 프로덕션에서 에러가 난다.😭</p>\n<p>당황스럽지 않을 수가 없다… ㅎㅎ</p>\n<p>빌드를 하게 되면 쓰지 않는 코드들을 자동으로 삭제하는데, AbstractComponent 안에 있는 input값이 사용되지 않는다고 판단해서 없앤 것 같다.</p>\n<h3 id=\"문제의-코드\" style=\"position:relative;\"><a href=\"#%EB%AC%B8%EC%A0%9C%EC%9D%98-%EC%BD%94%EB%93%9C\" aria-label=\"문제의 코드 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>문제의 코드</h3>\n<ul>\n<li>추상 컴포넌트: AbstractComponent</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">abstract</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AbstractComponent</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">Input</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> input$<span class=\"token operator\">:</span> Observable<span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n  <span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">Input</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> keyEvent$<span class=\"token operator\">:</span> Observable<span class=\"token operator\">&lt;</span>KeyboardEvent<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n  <span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">Input</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> isFocused$<span class=\"token operator\">:</span> BehaviorSubject<span class=\"token operator\">&lt;</span><span class=\"token builtin\">boolean</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token function\">ngOnInit</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>keyEvent$<span class=\"token punctuation\">.</span><span class=\"token function\">pipe</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">...</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n  <span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>AbstractComponent를 extends하고 있는 컴포넌트</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">PCSearchAutoComponent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">AbstractComponent</span> <span class=\"token punctuation\">{</span>\n<span class=\"token operator\">...</span><span class=\"token operator\">...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">PCSearchHistoryComponent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">AbstractComponent</span> <span class=\"token punctuation\">{</span>\n<span class=\"token operator\">...</span><span class=\"token operator\">...</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h3 id=\"에러-메시지\" style=\"position:relative;\"><a href=\"#%EC%97%90%EB%9F%AC-%EB%A9%94%EC%8B%9C%EC%A7%80\" aria-label=\"에러 메시지 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>에러 메시지</h3>\n<ul>\n<li>can’t bind to keyEvents$ since it isn’t a known property of mp-search-history</li>\n<li>ERROR TypeError: Cannot read property ‘pipe’ of undefined</li>\n</ul>\n<h2 id=\"해결-방안\" style=\"position:relative;\"><a href=\"#%ED%95%B4%EA%B2%B0-%EB%B0%A9%EC%95%88\" aria-label=\"해결 방안 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>해결 방안</h2>\n<ol>\n<li>자식 컴포넌트에 input 값들을 선언</li>\n</ol>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">PCSearchAutoComponent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">SearchTypeaheadInteraction</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">Input</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> input$<span class=\"token operator\">:</span> Observable<span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n  <span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">Input</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> keyEvent$<span class=\"token operator\">:</span> Observable<span class=\"token operator\">&lt;</span>KeyboardEvent<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n  <span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">Input</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> isFocused$<span class=\"token operator\">:</span> BehaviorSubject<span class=\"token operator\">&lt;</span><span class=\"token builtin\">boolean</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">export</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">PCSearchHistoryComponent</span> <span class=\"token keyword\">extends</span> <span class=\"token class-name\">SearchTypeaheadInteraction</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">Input</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> input$<span class=\"token operator\">:</span> Observable<span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n  <span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">Input</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> keyEvent$<span class=\"token operator\">:</span> Observable<span class=\"token operator\">&lt;</span>KeyboardEvent<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n  <span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">Input</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> isFocused$<span class=\"token operator\">:</span> BehaviorSubject<span class=\"token operator\">&lt;</span><span class=\"token builtin\">boolean</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>각 자식 컴포넌트들에게도 <code class=\"language-text\">Input</code> 값들을 선언해준다.</li>\n<li>공통 컴포넌트에 @Directive() 데코레이터 선언</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">Directive</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n<span class=\"token keyword\">export</span> <span class=\"token keyword\">abstract</span> <span class=\"token keyword\">class</span> <span class=\"token class-name\">AbstractComponent</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">Input</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> input$<span class=\"token operator\">:</span> Observable<span class=\"token operator\">&lt;</span><span class=\"token builtin\">string</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n  <span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">Input</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> keyEvent$<span class=\"token operator\">:</span> Observable<span class=\"token operator\">&lt;</span>KeyboardEvent<span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n  <span class=\"token decorator\"><span class=\"token at operator\">@</span><span class=\"token function\">Input</span></span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> isFocused$<span class=\"token operator\">:</span> BehaviorSubject<span class=\"token operator\">&lt;</span><span class=\"token builtin\">boolean</span><span class=\"token operator\">></span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<ul>\n<li>AbstractComponent에 데코레이터만 추가해주면 쉽게 해결 할 수 있다.</li>\n<li>Angular9부터 Angular가 Abstract class가 올바르게 상속할 수 있다는 것을 알 수 있게, @Directive() 데코레이터를 사용해야한다.</li>\n</ul>\n<blockquote>\n<p>참고</p>\n</blockquote>\n<ul>\n<li><a href=\"https://github.com/angular/angular/issues/35295\">Angluar Github</a></li>\n</ul>","frontmatter":{"title":"Cant bind input when using abstract classes 2+ level of hierarchy","date":"April 24, 2020"}}},"pageContext":{"slug":"/Today I Learned/Cant bind input when using_abstract_classes_2+_level_of_hierarchy/","previous":{"fields":{"slug":"/JavaScript/Callback_Function/"},"frontmatter":{"title":"Callback Function","category":"JavaScript","draft":false}},"next":{"fields":{"slug":"/Test/테스트의_종류/"},"frontmatter":{"title":"테스트의 종류","category":"Test","draft":false}}}},"staticQueryHashes":["3128451518","96099027"]}